Convert Brauniger to new serial scheme.
authorrobertl <robertl>
Fri, 14 Jul 2006 22:46:52 +0000 (22:46 +0000)
committerrobertl <robertl>
Fri, 14 Jul 2006 22:46:52 +0000 (22:46 +0000)
brauniger_iq.c

index 41759c1fd6110ab0c27516bcfbe4a2da8c874a79..b42c849da963057b8fe7a474b9d4c2e69143d8c7 100644 (file)
  */
 
 #include "defs.h"
-#include "jeeps/gpsserial.h"
+#include "gbser.h"
 #include <errno.h>
 
-/*static int32 fd;*/
-static char *port;
+static void *serial_handle;
 
 #define MYNAME "BRAUNIGER-IQ"
 #define PRESTRKNAME "PRESALTTRK"
-#define GPS_Serial_On(a, b) 0
-#define GPS_Serial_Off(a, b) 0
 
-#if 0
 static enum {
     st_sync,
     st_fl_num,
@@ -52,40 +48,23 @@ static enum {
 } state;
 
 static const int reqd_bytes[num_states] = { 6, 1, 2, 2, 25, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1 };
-#endif
 
-static void rd_init(const char *fname)
-{
-    port = xstrdup(fname);
-
-    // Fortunately the instruments use the same serial settings as the Garmin
-    // GPS receivers (9600-8-N) so we can use jeeps and hence we don't need
-    // to worry about OS dependencies here.
-    if (!GPS_Serial_On(port, &fd)) {
-       fatal(MYNAME ": Can't initialise port '%s'\n", port);
-    }
+static void rd_init(const char *fname) {
+       if (serial_handle = gbser_init(fname), NULL == serial_handle) {
+               fatal(MYNAME ": Can't initialise port '%s'\n", fname);
+       }
 }
 
-static void rd_deinit(void)
-{
-#if BOOGER
-    if (!GPS_Serial_Off(port, fd)) {
-       fatal(MYNAME ": Can't shut down port '%s'\n", port);
-    }
-    if (!GPS_Serial_Close(fd, port)) {
-       fatal(MYNAME ": Can't close port '%s'\n", port);
-    }
-#endif /* BOOGER */
-    xfree(port);
+static void rd_deinit(void) {
+       gbser_deinit(serial_handle);
+       serial_handle = NULL;
 }
 
-#if 0
 /**
  * Process a data record.
  * @return zero when all expected data has been received
  */
-static int process_data(const unsigned char *data)
-{
+static int process_data(const unsigned char *data) {
     static int remaining = 100;
     static struct tm tm;
     static time_t start, creation;
@@ -96,180 +75,175 @@ static int process_data(const unsigned char *data)
     int i;
 
     if (global_opts.debug_level >= 3) {
-       for (i = 0; i < reqd_bytes[state]; i++) {
-           printf("%.2x ", data[i]);
-       }
-       puts("");
+               for (i = 0; i < reqd_bytes[state]; i++) {
+                       printf("%.2x ", data[i]);
+               }
+               puts("");
     }
 
     remaining -= reqd_bytes[state];
     switch (state) {
     case st_sync:
-       if (memcmp(data, "\x30\x31\x32\x33\x34\x35", 6) != 0) {
-           fatal(MYNAME ": Could not synchronise\n");
-       }
-       break;
+               if (memcmp(data, "\x30\x31\x32\x33\x34\x35", 6) != 0) {
+                       fatal(MYNAME ": Could not synchronise\n");
+               }
+               break;
 
     case st_fl_num:
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Flight Number: %d\n", data[0]);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Flight Number: %d\n", data[0]);
+               }
+               break;
 
     case st_data_len:
-       remaining = (data[0] << 8) + data[1] - 2;
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Data Length: %d\n", remaining);
-       }
-       break;
+               remaining = (data[0] << 8) + data[1] - 2;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Data Length: %d\n", remaining);
+               }
+               break;
 
     case st_ser_num:
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Serial Number: %d\n", (data[0] << 8) + data[1]);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Serial Number: %d\n", (data[0] << 8) + data[1]);
+               }
+               break;
 
     case st_pilot_name:
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Pilot Name: %.25s\n", data);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Pilot Name: %.25s\n", data);
+               }
+               break;
 
     case st_start_date:
-       i = (data[0] << 8) + data[1];
-       tm.tm_mday = i / 100;
-       tm.tm_mon = (i % 100) - 1;
-       break;
+               i = (data[0] << 8) + data[1];
+               tm.tm_mday = i / 100;
+               tm.tm_mon = (i % 100) - 1;
+               break;
 
     case st_start_year:
-       tm.tm_year = ((data[0] << 8) + data[1]) - 1900;
-       break;
+               tm.tm_year = ((data[0] << 8) + data[1]) - 1900;
+               break;
 
     case st_max_alt_1:
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Max Altitude 1: %dm\n", (data[0] << 8) + data[1]);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Max Altitude 1: %dm\n", (data[0] << 8) + data[1]);
+               }
+               break;
 
     case st_max_alt_2:
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Max Altitude 2: %dm\n", (data[0] << 8) + data[1]);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Max Altitude 2: %dm\n", (data[0] << 8) + data[1]);
+               }
+               break;
 
     case st_max_climb:
-       if (global_opts.debug_level >= 1) {
-           i = (data[0] << 8) + data[1];
-           printf(MYNAME ": Max climb: %d.%dm/s\n", i / 10, i % 10);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       i = (data[0] << 8) + data[1];
+                       printf(MYNAME ": Max climb: %d.%dm/s\n", i / 10, i % 10);
+               }
+               break;
 
     case st_flight_dur:
-       if (global_opts.debug_level >= 1) {
-           i = (data[0] << 8) + data[1];
-           printf(MYNAME ": Flight Time: %d:%d\n", i / 100, i % 100);
-       }
-       break;
+               if (global_opts.debug_level >= 1) {
+                       i = (data[0] << 8) + data[1];
+                       printf(MYNAME ": Flight Time: %d:%d\n", i / 100, i % 100);
+               }
+               break;
 
     case st_log_ival:
-       interval = data[0];
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Logging Interval: %ds\n", interval);
-       }
-       break;
+               interval = data[0];
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Logging Interval: %ds\n", interval);
+               }
+               break;
 
     case st_start_time:
-       i = (data[0] << 8) + data[1];
-       tm.tm_hour = i / 100;
-       tm.tm_min = (i % 100) - 1;
-       tm.tm_sec = 0;
-       creation = start = mktime(&tm);
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": Start Time: %s", ctime(&start));
-       }
-       break;
+               i = (data[0] << 8) + data[1];
+               tm.tm_hour = i / 100;
+               tm.tm_min = (i % 100) - 1;
+               tm.tm_sec = 0;
+               creation = start = mktime(&tm);
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": Start Time: %s", ctime(&start));
+               }
+               break;
 
     case st_end_time:
-       i = (data[0] << 8) + data[1];
-       tm.tm_hour = i / 100;
-       tm.tm_min = (i % 100) - 1;
-       finish = mktime(&tm);
-       if (global_opts.debug_level >= 1) {
-           printf(MYNAME ": End Time: %s", ctime(&finish));
-       }
-       if (remaining) {
-           track = route_head_alloc();
-           track->rte_name = xstrdup(PRESTRKNAME);
-           track->rte_desc = xstrdup("Brauniger-IQ Barograph");
-           track_add_head(track);
-       } else {
-           warning(MYNAME ": No barograph recorded for this flight\n");
-       }
-       break;
+               i = (data[0] << 8) + data[1];
+               tm.tm_hour = i / 100;
+               tm.tm_min = (i % 100) - 1;
+               finish = mktime(&tm);
+               if (global_opts.debug_level >= 1) {
+                       printf(MYNAME ": End Time: %s", ctime(&finish));
+               }
+               if (remaining) {
+                       track = route_head_alloc();
+                       track->rte_name = xstrdup(PRESTRKNAME);
+                       track->rte_desc = xstrdup("Brauniger-IQ Barograph");
+                       track_add_head(track);
+               } else {
+                       warning(MYNAME ": No barograph recorded for this flight\n");
+               }
+               break;
 
     case st_sample_alt:
-       wpt = waypt_new();
-       wpt->latitude = wpt->longitude = 0.0;
-       wpt->creation_time = creation;
-       creation += interval;
-       wpt->altitude = (data[0] << 8) + data[1];
-       track_add_wpt(track, wpt);
-       if (global_opts.debug_level >= 2) {
-           printf(MYNAME ": remaining=%d, Altitude=%fm, ", remaining, wpt->altitude);
-       }
-       break;
+               wpt = waypt_new();
+               wpt->latitude = wpt->longitude = 0.0;
+               wpt->creation_time = creation;
+               creation += interval;
+               wpt->altitude = (data[0] << 8) + data[1];
+               track_add_wpt(track, wpt);
+               if (global_opts.debug_level >= 2) {
+                       printf(MYNAME ": remaining=%d, Altitude=%fm, ", remaining, wpt->altitude);
+               }
+               break;
 
     case st_sample_spd:
-       if (global_opts.debug_level >= 2) {
-           printf("Airspeed=%dkmh\n", data[0]);
-       }
-       state = st_sample_alt;
-       return remaining;
+               if (global_opts.debug_level >= 2) {
+                       printf("Airspeed=%dkmh\n", data[0]);
+               }
+               state = st_sample_alt;
+               return remaining;
 
     default:
-       fatal(MYNAME ": Bad internal state\n");
+               fatal(MYNAME ": Bad internal state\n");
     }
     state++;
     return remaining;
 }
-#endif
 
-static void data_read(void)
-{
-#if BOOGER
+static void data_read(void) {
     unsigned char ibuf[25];
-    int32 rd_cnt, ofs;
+    int rd_cnt;
 
     if (global_opts.debug_level >= 0) {
-       puts(MYNAME ":  Select recorded flight in memo mode.");
-       puts(MYNAME ":  Press Memo button for two seconds...");
+               puts(MYNAME ":  Select recorded flight in memo mode.");
+               puts(MYNAME ":  Press Memo button for two seconds...");
     }
+
     // Wait until something arrives
-    while (!GPS_Serial_Wait(fd));
     if (global_opts.debug_level >= 0) {
-       puts(MYNAME ":  Downloading flight...");
+               puts(MYNAME ":  Downloading flight...");
     }
-    // Read data until there is none left to read
+
+       // Read data until there is none left to read
     state = st_sync;
-    ofs = 0;
-    do {
-       if (0 > (rd_cnt = GPS_Serial_Read(fd, ibuf + ofs, reqd_bytes[state] - ofs))) {
-           fatal(MYNAME ": Error reading port '%s', %s\n", port, strerror(errno));
-       }
-       if (reqd_bytes[state] == rd_cnt + ofs) {
-           if (!process_data(ibuf)) {
-               if (global_opts.debug_level >= 0) {
-                   puts(MYNAME "  ...Finished");
+       for (;;) {
+               /* wait up to 5 seconds for more data */
+               rd_cnt = gbser_read_wait(serial_handle, ibuf, reqd_bytes[state], 5000);
+               if (rd_cnt < 0) {
+                       fatal(MYNAME ": Serial error\n");
+               } else if (rd_cnt < reqd_bytes[state]) {
+                       fatal(MYNAME ": Incomplete download\n");
+               }
+
+               if (!process_data(ibuf)) {
+                       if (global_opts.debug_level >= 0) {
+                               puts(MYNAME "  ...Finished");
+                       }
+                       return;
                }
-               return;
-           }
-           ofs = 0;
-       } else {
-           ofs += rd_cnt;
        }
-    } while (GPS_Serial_Wait(fd));
-    fatal(MYNAME ": Incomplete download\n");
-#endif
 }
 
 static arglist_t brauniger_iq_args[] = {